# -*- coding: UTF-8 -*-
from datetime import date
from urlparse import urlparse
from django.core.urlresolvers import reverse
from django.core.exceptions import ObjectDoesNotExist
from django.template import RequestContext
from django.http import HttpResponse, Http404 #, HttpResponseRedirect
from django.shortcuts import render_to_response
from django.core.mail import send_mail
from django.conf import settings
from django.contrib.auth.decorators import login_required, user_passes_test
from django.db.models import Avg

from lib.ajax import AJAXFallbackView
from avanzaweb.models import *
from avanzaweb.forms import *

def index(request):
     fotoini = Media.objects.filter(inicial = True, tipo = 'F').order_by('orden') 
     menu, actual = render_menu(request)
     return render_to_response('inicio.html', {'menu': menu, 'actual': actual, 'titulo':  'Bravo, viviendas diferentes', 'fotosini': fotoini, 'interno': interno(request) },context_instance=RequestContext(request))

def contenido(request, cn, h=None):
     pag = Pagina.objects.get(nombre = cn)
     if not pag:
          raise Http404
     fotoini = Media.objects.filter(inicial = True, tipo = 'F').order_by('orden') 
     contenidos = Contenido.objects.select_related().filter(pagina = pag.id).order_by('orden')
     menu, actual = render_menu(request)
     return render_to_response('contenido.html', {'menu': menu, 'actual': actual, 'titulo':  pag.titulo, 'contenidos': contenidos, 'fotosini': fotoini, 'h': h, 'interno': interno(request) },context_instance=RequestContext(request))

def novedades(request):
     fotoini = Media.objects.filter(inicial = True, tipo = 'F').order_by('orden') 
     pag = Pagina.objects.get(nombre = 'novedades')
     if not pag:
          raise Http404
     contenidos = Contenido.objects.select_related().filter(pagina = pag.id).order_by('-fecha')
     menu, actual = render_menu(request)
     return render_to_response('novedades.html',{'menu': menu, 'actual': actual, 'titulo':  pag.titulo, 'contenidos': contenidos, 'fotosini': fotoini, 'interno': interno(request)},context_instance=RequestContext(request))
               
def frmContacto(request):
     fotoini = Media.objects.filter(inicial = True, tipo = 'F').order_by('orden') 
     retorno = ''
     pag = Pagina.objects.get(nombre = 'contacto')
     c = Contenido.objects.filter(pagina = pag.id).order_by('orden')
     if request.method == 'POST': 
          form = ContactForm(request.POST) 
          if form.is_valid():
               from django.utils.html import escape
               send_mail('Petición de información', escape(form.cleaned_data['texto']), escape(form.cleaned_data['de']), settings.DESTINO_EMAIL)
               retorno = 'Correcto'
          else:
               retorno = 'Errores'
     else:
          form = ContactForm()
     menu, actual = render_menu(request)
     return render_to_response('corpform.html',{'menu': menu, 'actual': actual, 'retorno': retorno,'form': form, 'titulo':  pag.titulo, 'c': c[0], 'fotosini': fotoini, 'interno': interno(request)},context_instance=RequestContext(request))

def promociones(request):
     fotoini = Media.objects.filter(inicial = True, tipo = 'F').order_by('orden') 
     promos = Promocion.objects.filter(enmenu = True).order_by('orden')
     menu, actual = render_menu(request)
     return render_to_response('promociones.html',{'menu': menu, 'actual': actual, 'titulo':  'Viviendas en venta', 'promociones': promos, 'fotosini': fotoini, 'interno': interno(request)},context_instance=RequestContext(request))

def promocion(request, pr, pdf=False):
     from django.db.models import Count
     try:
          promo = Promocion.objects.get(id = pr, enmenu = True)
     except ObjectDoesNotExist:
          raise Http404
     fotos = Promocion_Media.objects.select_related().filter(promocion = promo) .order_by('orden')
     hp = Promocion_Media.objects.filter(promocion = promo, media__tipo__exact = 'P').aggregate(Count('id'))
     hayp = True if hp['id__count'] > 0 else False
     lugar = promo.direccion + ' ' + promo.localidad + ' ' + promo.cp
     if pdf:
          from django.template.loader import render_to_string
          mapa = mapa_img(promo.lat, promo.lng)       
          html = render_to_string('promo_pdf.html', {'pagesize':'A4', 'nombre': promo.nombre, 'descripcion': promo.descripcion, 'mapa': mapa, 'memoria': promo.memoria, 'fotos': fotos},context_instance=RequestContext(request))
          return generar_pdf(html)     
     else:
          menu, actual = render_menu(request)
          return render_to_response('promo.html',{'menu': menu, 'actual': actual, 'promo': promo.id, 'nombre': promo.nombre, 'descripcion': promo.descripcion, 'lugar': lugar, 'memoria': promo.memoria, 'fotos': fotos, 'vigente': promo.vigente, 'hayplano': hayp, 'interno': interno(request)},context_instance=RequestContext(request))

@login_required
@user_passes_test(lambda u: u.is_active)
def cuestionario(request, pr=None):
     if pr == None:
          return contenido(request, 'inicio')
     else:
          promo = Promocion.objects.get(id = pr)
          if promo.fecha > date.today():
               return render_to_response('cuestionario.html',{'next': reverse('contenido', args=('inicio',)), 'resultado': 'Esta encuesta ha superado su período de vigencia.'},context_instance=RequestContext(request))
          if Survey.objects.filter(ip__exact = request.META['REMOTE_ADDR']):
               return render_to_response('cuestionario.html',{'next':  reverse('contenido', args=('inicio',)), 'resultado': 'Ya hay registrada una encuesta desde este origen.'},context_instance=RequestContext(request))
          sur = Survey()
          if request.method == 'POST': 
               from django.contrib.auth import logout
               usuario = request.user
               sur.fecha = date.today()
               sur.promocion = promo
               sur.ip = request.META['REMOTE_ADDR']
               form = SurveyForm(request.POST, instance = sur)
               if form.is_valid():
                    form.save()
                    if not usuario.is_superuser:
                         usuario.is_active = False
                         usuario.save()
                         logout()
                    return render_to_response('cuestionario.html',{'form': form, 'next':  reverse('contenido', args=('inicio',)), 'resultado': 'Gracias por completar nuestra encuesta.'},context_instance=RequestContext(request))
          else:
               form = SurveyForm(instance = sur)
          return render_to_response('cuestionario.html',{'form': form, 'next': '', 'resultado': ''},context_instance=RequestContext(request))

def estadistica(request):
     cn = 'clientes'
     est = Survey.objects.filter(publicada = True).aggregate(Avg('satis_plan'), Avg('trato'), Avg('satis_plan'), Avg('satis_viv'), Avg('posventa'), Avg('calidad_precio'))
     fotoini = Media.objects.filter(inicial = True, tipo = 'F') .order_by('orden') 
     fotos = Pagina_Media.objects.select_related().filter(pagina__nombre__exact = cn) .order_by('orden') 
     comentarios = Survey.objects.filter(pub_comentario = True).values('comentario')
     if fotos:
          pag = fotos[0].pagina
     else:
          pag = Pagina.objects.get(nombre = cn)
     content = u''
     if est['trato__avg']:
          content += u'<div>Esto es lo que opinan los clientes de Bravo, viviendas diferentes:</div>'
          content += u'<div class="barcont"><div class="barperc" style="width:%s%%; background-color: rgb(%s)">Trato recibido: %s sobre 10</div></div>'%(est['trato__avg'] * 10-1,  rgb(est['trato__avg']), int(est['trato__avg']))
          content += u'<div class="barcont"><div class="barperc" style="width:%s%%; background-color: rgb(%s)">Satisfacción vivienda: %s sobre 10</div></div>'%(est['satis_viv__avg'] * 10-1, rgb(est['satis_viv__avg']) , int(est['satis_viv__avg']))
          content += u'<div class="barcont"><div class="barperc" style="width:%s%%; background-color: rgb(%s)">Trato postventa: %s sobre 10</div></div>'%(est['posventa__avg'] * 10-1,  rgb(est['posventa__avg']) ,int(est['posventa__avg']))
          content += u'<div class="barcont"><div class="barperc" style="width:%s%%; background-color: rgb(%s)">Calidad-precio: %s sobre 10</div></div>'%(est['calidad_precio__avg'] * 10-1,  rgb(est['calidad_precio__avg']), int(est['calidad_precio__avg']))
          content += u'<div class="barcont"><div class="barperc" style="width:%s%%; background-color: rgb(%s)">Plan financiación: %s sobre 10</div></div><br/>'%(est['satis_plan__avg'] * 10-1,  rgb(est['satis_plan__avg']), int(est['satis_plan__avg']))
     if comentarios:
          content += '<div>Comentarios</div>'
     for com in comentarios:
          content += u'<div class="comment">&quot;' + com['comentario'] + u'&quot;</div><hr style="width: 20%; margin: 5px auto;" />'
     clase = ''
     content += u''
     menu, actual = render_menu(request) 
     return render_to_response('clientes.html',{'menu': menu, 'actual': actual, 'titulo':  pag.titulo, 'contenidos': content, 'fotos': fotos, 'fotosini': fotoini, 'clase': clase, 'interno': interno(request)},context_instance=RequestContext(request))
       

####PDF
def generar_pdf(html):
     import cStringIO as StringIO
     import ho.pisa as pisa
     import cgi
     # Función para generar el archivo PDF y devolverlo mediante HttpResponse
     result = StringIO.StringIO()
     pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result)
     if not pdf.err:
          return HttpResponse(result.getvalue(), mimetype='application/pdf')
     return HttpResponse('Error al generar el PDF: %s' % cgi.escape(html))


def geocode(direccion):
     import urllib2, json
     url = 'http://maps.google.com/maps/api/geocode/json?address=%s&sensor=false' % direccion.replace(' ','+').encode('utf-8') #(' ', '+')
     result=json.load(urllib2.urlopen(url))
     if result['status'] == 'OK':
          return [result['results'][0]['geometry']['location']['lat'], result['results'][0]['geometry']['location']['lng']]
     else:
          return [0,0]
          
def mapa_img(lat, lng):
     import urllib, tempfile
     url = 'http://maps.google.com/staticmap?center=%s,%s&zoom=14&size=600x300&key=%s&markers=%s,%s&sensor=false'%(lat, lng, settings.MAPS_API_KEY, lat, lng)
     f = tempfile.NamedTemporaryFile(suffix = '.gif', delete=False)
     urllib.urlretrieve (url, f.name)
     return f.name

def rgb(num):
     num = int(num)
     r=str(155+(num * 10))
     g=str(255-num*10)
     b=str(100 +(255-num*10))
     return r+','+g+','+b
     
def render_menu(request):
     ret=[]
     actual = None
     for c in Menu.objects.filter(padre__isnull=True).order_by('orden'):
          if c.uri == request.path:
               actual = c.nombre
          else:
               menu = {}
               menu['nombre'] = c.nombre
               menu['uri'] = c.uri
               menu['clase'] = c.clase
               menu['subm'] = Menu.objects.filter(padre=c).order_by('orden')
               ret.append(menu)
     if not actual:
          actual ='menú'
     return ret, actual

def interno(request):
     try:
          hostname = urlparse(request.META.get('HTTP_REFERER')).hostname
          tes = [hostname in h for h in settings.ALLOWED_HOSTS]
          for t in tes:
               if t:
                    return True
          return False
     except:
          return False